package com.woniuxy.shiro.Utils;


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Date;

public class JWTUtil {
        //过期时间5分钟
        private static final long EXPIRE_TIME = 5*60*1000;
        /**
         * Description : 校验token是否正确,错了就直接异常了 所以就直接返回true即可  <br/>
         * ChangeLog : 1. 创建 (2021/5/3 21:58 [mayuhang]);
         * @param token 密钥
         *        username 用户名
         *        secret 用户的密码  用于加密 作为解密条件 类似之前jwt教学中的signWith
         *              //签名算法 以及签的名字
         *             .signWith(SignatureAlgorithm.HS256, "woniuxy");
         * @return 是否正确
         **/
        public static boolean verify(String token,String username,String secret){
            //这里需要和生成签名的签名算法保持一致~
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
            verifier.verify(token);
            return true;
        }
        /**
         * Description : 获得token中的信息无需secret解密也能获得  <br/>
         * ChangeLog : 1. 创建 (2021/5/3 22:01 [mayuhang]);
         * @param token
         * @return token中包含的用户名
         **/
        public static String getUserName(String token){
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("username").asString();
        }
        /**
         * Description : 生成签名,5min后过期  <br/>
         * ChangeLog : 1. 创建 (2021/5/3 22:01 [mayuhang]);
         * @param username 用户名
         * @param secret 用户的密码
         * @return 加密的token
         **/
        public static String sign(String username,String secret){
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            Algorithm algorithm = Algorithm.HMAC256(secret);
            return JWT.create()
                    .withClaim("username",username)
                    .withExpiresAt(date)
                    .sign(algorithm);
        }
    }

